「 Velero 」操作卷数据(CSI)

「 Velero 」操作卷数据(CSI)


based on v1.6.3

可以将 CSI 快照支持集成到 Velero 中,使 Velero 能够使用 Kubernetes CSI 快照 API 备份和恢复 CSI 支持的卷。通过 CSI 快照 API,Velero 可以支持任何具有 CSI 快照的卷,而无需特定的 Velero 插件。

在 Velero v1.6 中,此特性为 beta 版本,目前 1.9+ 为稳定版本

前置依赖

  • Kubernetes 版本至少为 1.17
  • 集群中的 CSI 具备快照能力,兼容 v1beta1 版本 API
  • 跨集群 CSI 卷快照恢复时,CSI Driver 快照类名需要保持一致

部署 Velero,开启 CSI 特性

1
2
3
4
5
6
7
8
$ velero install \
--provider aws \
--features EnableCSI \
--plugins velero/velero-plugin-for-aws:v1.0.0,velero/velero-plugin-for-csi:v0.1.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000

参数说明

  • --features 开启 feature 特性

流程验证

StorageClass

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-lvmsc
allowVolumeExpansion: true
parameters:
volgroup: "lvm_im"
fstype: "ext4"
maxVolumeSize: "5"
provisioner: local.csi.openebs.io
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

PersistentVolumeClaim

1
2
3
4
5
6
7
8
9
10
11
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: local-pvc
spec:
storageClassName: openebs-lvmsc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Mi

Pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Pod
metadata:
name: pod-local-im
spec:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
restartPolicy: Never
containers:
- name: perfrunner
image: busybox:1.27
command: ["sh"]
args: ["-c", "while true ;do sleep 50; done"]
volumeMounts:
- mountPath: /datadir
name: fio-vol
tty: true
volumes:
- name: fio-vol
persistentVolumeClaim:
claimName: local-pvc

操作验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 写入测试数据
$ kubectl exec -it pod-local-im ls /datadir
data lost+found

# 创建备份任务
$ velero backup create default --include-namespaces default

# 查看快照信息,发现此时 Velero 已经调用 CSI 创建了 volumesnapshot,并生成了 volumesnapshotcontent,并且查看 volumesnapshot 的状态 readyToUse 为 True
$ kubectl get volumesnapshot
NAMESPACE NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
default velero-local-pvc-bdbw8 true local-pvc 30Mi csi-local-snapclass snapcontent-93903201-f07a-405c-92d9-2c0b6bafd6a1 117s 118s

$ kubectl get volumesnapshotcontent
NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT VOLUMESNAPSHOTNAMESPACE AGE
snapcontent-93903201-f07a-405c-92d9-2c0b6bafd6a1 true 31457280 Delete local.csi.openebs.io csi-local-snapclass velero-local-pvc-bdbw8 default 2m38s

# 模拟故障
$ kubectl delete -f pod.yaml && kubectl delete -f pvc.yaml

# 创建恢复任务
$ velero restore create --from-backup default

$ kubectl get volumesnapshotcontent
NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT VOLUMESNAPSHOTNAMESPACE AGE
snapcontent-93903201-f07a-405c-92d9-2c0b6bafd6a1 true 31457280 Delete local.csi.openebs.io csi-local-snapclass velero-local-pvc-bdbw8 default 3m31s
velero-velero-local-pvc-bdbw8-z9t2f true 0 Delete local.csi.openebs.io velero-local-pvc-bdbw8 default 2m3s

# 可以看到,Velero 调用 CSI Driver 基于之前的 volumesnapshot 恢复出来了一个 PVC
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
local-pvc Bound pvc-f034e865-340a-40cf-9381-3b95b1bd2f1f 30Mi RWO openebs-lvmsc 4m16s

$ kubectl get pvc -o yaml
<skip>
spec:
accessModes:
- ReadWriteOnce
dataSource:
apiGroup: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: velero-local-pvc-bdbw8
resources:
requests:
storage: 30Mi
storageClassName: openebs-lvmsc
volumeMode: Filesystem
volumeName: pvc-f034e865-340a-40cf-9381-3b95b1bd2f1f

# 数据已经从快照恢复
$ kubectl exec -it pod-local-im ls /datadir
data lost+found

流程走读

Velero 的 CSI 支持不依赖 Velero VolumeSnapshotter 插件。相反,Velero 采用一组 BackupItemAction 插件用于在操作 PersistentVolumeClaims 之前进行一些额外的动作。

备份时,当 BackupItemAction 发现有一个 PersistentVolumeClaims 指向由 CSI Driver 创建的 PersistentVolume 时,它将获取具有相同 Driver 名称的 VolumeSnapshotClass 来创建以 PersistentVolumeClaim 为源的 CSI VolumeSnapshot 对象,VolumeSnapshot 和 PersistentVolumeClaim 位于同一命名空间中。

接着,CSI external-snapshotter watch 到 VolumeSnapshot 之后创建一个 VolumeSnapshotContent 对象,它将指向存储系统中实际的、基于磁盘的快照。 external-snapshotter 会调用 CSI Driver 的 snapshot 方法,Driver 会调用存储系统的 API 生成快照。一旦生成 ID 并且存储系统将快照标记为可用于恢复,VolumeSnapshotContent 对象将使用 status.snapshotHandle 进行更新,并且设置status.readyToUse 字段为 true。

Velero 将在备份 tarball 中包含生成的 VolumeSnapshot 和 VolumeSnapshotContent 对象,并将 JSON 文件中的所有 VolumeSnapshots 和 VolumeSnapshotContents 对象上传到对象存储系统。当 Velero 将备份同步到新集群时,VolumeSnapshotContent 对象也将同步到集群中,以便 Velero 可以适当地管理备份过期。

VolumeSnapshotClass 的 DeletionPolicy 设置为 Retain 时,Velero 备份的生命周期内保留存储系统中的卷快照,并防止在发生灾难时删除存储系统中的卷快照,其中命名空间与VolumeSnapshot 对象可能会丢失。

当 Velero 备份到期时,VolumeSnapshot 对象将被删除,VolumeSnapshotContent 对象的 DeletionPolicy 将更新 Delete,以释放存储系统上的空间。

Author

Shen Xianghong

Posted on

2022-01-10

Updated on

2023-06-19

Licensed under